package com.todod.base.module.infra.api.file;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.todod.base.framework.common.pojo.CommonResult;
import com.todod.base.framework.common.util.object.BeanUtils;
import com.todod.base.framework.common.util.office.FileCustomUtils;
import com.todod.base.module.infra.api.file.dto.FileCreateReqDTO;
import com.todod.base.module.infra.api.file.dto.FileRelationReqDTO;
import com.todod.base.module.infra.dal.dataobject.file.FileDO;
import com.todod.base.module.infra.dal.mysql.file.FileMapper;
import com.todod.base.module.infra.enums.untils.MinIoUtils;
import com.todod.base.module.infra.framework.file.core.utils.FileTypeUtils;
import com.todod.base.module.infra.service.file.FileService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

import jakarta.annotation.Resource;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static com.todod.base.framework.common.pojo.CommonResult.success;

@RestController // 提供 RESTful API 接口，给 Feign 调用
@Validated
public class FileApiImpl implements FileApi {
    @Value("${file.visit}")
    private String visi;

    @Value("${file.visithttps}")
    private String visiHttps;
    // 存储桶名称
    @Value("${minio.bucketName}")
    private String bucketName;
    @Autowired
    private MinIoUtils minIoUtils;
    @Resource
    private FileService fileService;
    @Resource
    private FileMapper fileMapper;

    @Override
    public CommonResult<String> createFile(FileCreateReqDTO createReqDTO) {
        return success(fileService.createFile(createReqDTO.getName(), createReqDTO.getPath(),
                createReqDTO.getContent()));
    }

    @Override
    public FileCreateReqDTO getFile(Long id) {
        FileDO fileDO = fileService.selectById(id);
        FileCreateReqDTO fileCreateReqDTO = new FileCreateReqDTO();
        fileCreateReqDTO.setId(fileDO.getId());
        fileCreateReqDTO.setConfigId(fileDO.getConfigId());
        fileCreateReqDTO.setCreateTime(fileDO.getCreateTime());
        fileCreateReqDTO.setName(fileDO.getName());
        fileCreateReqDTO.setPath(fileDO.getPath());
        fileCreateReqDTO.setUrl(fileDO.getUrl());
        return fileCreateReqDTO;
    }

    @Override
    public FileCreateReqDTO newCreateFileByte(FileCreateReqDTO createReqDTO) {
        // 计算默认的 path 名
        String type = FileTypeUtils.getMineType(createReqDTO.getContent(), createReqDTO.getName());
        String url = "";
        try{
            // 生成文件
            File file = new File(createReqDTO.getPath());
//            File tempFile = FileUtils.createFile(file,createReqDTO.getContent());
            // 转换为 MultipartFile
            MultipartFile multipartFile = FileCustomUtils.file2MultipartFile(file,type);
            url = minIoUtils.upload(multipartFile, bucketName, null);
        } catch (Exception e){
            e.printStackTrace();
        }
        // 保存到数据库
        FileDO file = new FileDO();
        file.setConfigId(22l);
        file.setName(createReqDTO.getName());
        file.setPath(createReqDTO.getPath());
        file.setUrl(visiHttps+url);
        file.setType(type);
        file.setSize(createReqDTO.getContent().length);
        file.setForeignTableId(createReqDTO.getForeignTableId());
        file.setForeignTableName(createReqDTO.getForeignTableName());
        file.setForeignFileType(createReqDTO.getForeignFileType());
        fileMapper.insert(file);
        return BeanUtils.toBean(file, FileCreateReqDTO.class);
    }

    @Override
    public FileCreateReqDTO newUpdateFileByte(FileCreateReqDTO createReqDTO) {// 计算默认的 path 名
        // 1、先获取到文件
        List<FileDO> listFile = fileService.getListByForeignTableInfo(createReqDTO.getForeignTableId(), createReqDTO.getForeignTableName(), createReqDTO.getForeignFileType());
        // 2、删除minio文件

        // 3、上传minio文件

        // 4、更新file


        String type = FileTypeUtils.getMineType(createReqDTO.getContent(), createReqDTO.getName());
        String url = "";
        try{
            // 生成文件
            File file = new File(createReqDTO.getPath());
//            File tempFile = FileUtils.createFile(file,createReqDTO.getContent());
            // 转换为 MultipartFile
            MultipartFile multipartFile = FileCustomUtils.file2MultipartFile(file,type);
//            minIoUtils.removeObject(bucketName,createReqDTO.getPath());
            url = minIoUtils.upload(multipartFile, bucketName, null);
        } catch (Exception e){
            e.printStackTrace();
        }
        listFile.stream().forEach(item->{

        });
        // 保存到数据库
        FileDO file = new FileDO();
        file.setId(listFile.get(0).getId());
        file.setConfigId(22l);
        file.setName(createReqDTO.getName());
        file.setPath(createReqDTO.getPath());
        file.setUrl(visiHttps+url);
        file.setType(type);
        file.setSize(createReqDTO.getContent().length);
        file.setForeignTableId(createReqDTO.getForeignTableId());
        file.setForeignTableName(createReqDTO.getForeignTableName());
        file.setForeignFileType(createReqDTO.getForeignFileType());


//        fileMapper.insert(file);
        fileMapper.updateById(file);
        return BeanUtils.toBean(file, FileCreateReqDTO.class);
    }

    @Override
    public FileCreateReqDTO updateFileRelation(FileCreateReqDTO createReqDTO) {
        // 1、先获取到文件
        List<FileDO> listFile = fileService.getListByForeignTableInfo(createReqDTO.getForeignTableId(), createReqDTO.getForeignTableName(), createReqDTO.getForeignFileType());
        List<FileDO> listGet = listFile.stream().filter(item -> item.getPath().equalsIgnoreCase(createReqDTO.getPath())).collect(Collectors.toList());
        String type = FileTypeUtils.getMineType(createReqDTO.getContent(), createReqDTO.getName());
        String url = "";
        try{
            // 生成文件
            File file = new File(createReqDTO.getPath());
//            File tempFile = FileUtils.createFile(file,createReqDTO.getContent());
            // 转换为 MultipartFile
            MultipartFile multipartFile = FileCustomUtils.file2MultipartFile(file,type);
//            minIoUtils.removeObject(bucketName,createReqDTO.getPath());
            url = minIoUtils.upload(multipartFile, bucketName, null);
        } catch (Exception e){
            e.printStackTrace();
        }
        // 保存到数据库
        FileDO file = new FileDO();
        if (listGet.size()>0){
            file.setId(listGet.get(0).getId());
            file.setConfigId(22l);
            file.setName(createReqDTO.getName());
            file.setPath(createReqDTO.getPath());
            file.setUrl(visiHttps+url);
            file.setType(type);
            file.setSize(createReqDTO.getContent().length);
            file.setForeignTableId(createReqDTO.getForeignTableId());
            file.setForeignTableName(createReqDTO.getForeignTableName());
            file.setForeignFileType(createReqDTO.getForeignFileType());
            fileMapper.updateById(file);
        }
//        fileMapper.insert(file);
//        fileMapper.updateById(file);
        return BeanUtils.toBean(file, FileCreateReqDTO.class);
    }

    @Override
    public List<FileCreateReqDTO> updateFileRelationPublic(FileRelationReqDTO reqDTO) {
        Long foreignTableId = reqDTO.getForeignTableId();
        String foreignTableName = reqDTO.getForeignTableName();
        String foreignFileType = reqDTO.getForeignFileType();
        // 原来的数据
        List<FileDO> oldList = fileService.getListByForeignTableInfo(foreignTableId, foreignTableName, foreignFileType);
        for (FileDO old:oldList){
            for (int i=0; i <= reqDTO.getFileList().size()-1 ; i++){
                FileCreateReqDTO itemReq = reqDTO.getFileList().get(i);
                if (old.getId().longValue() == itemReq.getId().longValue()){
                   break;
                } else {
                    if (i==reqDTO.getFileList().size()-1){
                        fileMapper.deleteById(old.getId());
                    }
                }
            }
        }

        reqDTO.getFileList().stream().forEach(item->{
            FileDO fileOld = fileMapper.selectById(item.getId());

            FileDO file = new FileDO();
            // 放回原数据
            file.setId(fileOld.getId());
            file.setConfigId(fileOld.getConfigId());
            file.setName(fileOld.getName());
            file.setPath(fileOld.getPath());
            file.setUrl(fileOld.getUrl());
            file.setType(fileOld.getType());
            file.setSize(fileOld.getSize());
            // 更新表信息数据
            file.setForeignTableId(foreignTableId);
            file.setForeignTableName(foreignTableName);
            file.setForeignFileType(foreignFileType);
            fileMapper.updateById(file);
        });
        return null;
    }

    @Override
    public List<FileCreateReqDTO> updateFileRelationPublic2(FileRelationReqDTO reqDTO) {
        Long foreignTableId = reqDTO.getForeignTableId();
        String foreignTableName = reqDTO.getForeignTableName();
        String foreignFileType = reqDTO.getForeignFileType();

        reqDTO.getFileList().stream().forEach(item->{
            FileDO fileOld = fileMapper.selectById(item.getId());

            FileDO file = new FileDO();
            // 放回原数据
            file.setId(fileOld.getId());
            file.setConfigId(fileOld.getConfigId());
            file.setName(fileOld.getName());
            file.setPath(fileOld.getPath());
            file.setUrl(fileOld.getUrl());
            file.setType(fileOld.getType());
            file.setSize(fileOld.getSize());
            // 更新表信息数据
            file.setForeignTableId(foreignTableId);
            file.setForeignTableName(foreignTableName);
            file.setForeignFileType(foreignFileType);
            fileMapper.updateById(file);
        });
        return null;
    }



    @Override
    public FileCreateReqDTO newCreateFileFile(String name, String path, MultipartFile file) {
        String type = file.getContentType();
        String url = "";
        try{
            url = minIoUtils.upload(file, bucketName, null);
        } catch (Exception e){
            e.printStackTrace();
        }

        // 保存到数据库
        FileDO file1 = new FileDO();
        file1.setConfigId(22l);
        file1.setName(name);
        file1.setPath(url);
        file1.setUrl(visiHttps+url);
        file1.setType(type);
        file1.setSize(Integer.valueOf(String.valueOf(file.getSize())));
        fileMapper.insert(file1);
        return BeanUtils.toBean(file1, FileCreateReqDTO.class);
    }

    @Override
    public List<FileCreateReqDTO> getListByForeignTableInfoIn(Long foreignTableId, String foreignTableName, String foreignFileType) {
        List<FileDO> list = fileService.getListByForeignTableInfo(foreignTableId, foreignTableName, foreignFileType);
        return BeanUtils.toBean(list, FileCreateReqDTO.class);
    }


    @Override
    public void copyFileRelationPublic(Long foreignTableId, String foreignTableName, String foreignFileType, Long oldForeignTableId, String oldForeignTableName, String oldForeignFileType) {

        List<FileDO> listOld = fileService.getListByForeignTableInfo(oldForeignTableId, oldForeignTableName, oldForeignFileType);
        listOld.stream().forEach(item->{
            FileDO file = new FileDO();
            // 放回原数据
            file.setConfigId(item.getConfigId());
            file.setName(item.getName());
            file.setPath(item.getPath());
            file.setUrl(item.getUrl());
            file.setType(item.getType());
            file.setSize(item.getSize());
            // 更新表信息数据
            file.setForeignTableId(foreignTableId);
            file.setForeignTableName(foreignTableName);
            file.setForeignFileType(foreignFileType);
            fileMapper.insert(file);
        });
    }

    @Override
    public void deleteFileListInUrl(Long oldForeignTableId, String oldForeignTableName, String oldForeignFileType) {
        List<FileDO> listOld = fileService.getListByForeignTableInfo(oldForeignTableId, oldForeignTableName, oldForeignFileType);
        listOld.stream().forEach(item->{
            // 删除继续收款的凭证
            fileMapper.deleteById(item.getId());
            // 删除继续收款复制过去的凭证
            List<FileDO> fileListByUrl = getFileListByUrl(item.getUrl());
            fileListByUrl.stream().forEach(item1->{
                fileMapper.deleteById(item1.getId());
            });
        });
    }

    private List<FileDO> getFileListByUrl(String url) {
        return fileMapper.getFileListByUrl(url);
    }

}
